#coding=utf-8
import threading
import time
import cv2
import serial
import pynmea2
import requests
import json
import logging

# 自己写的包
import gps
import config
import Qrcode


'''
检查各模块是否工作正常，正常返回1，不正常返回-1，同时写入日志信息（待实现）
'''
def check_bus():
    state = True

    # 检查网络
    ret_status_net = check_network()
    if ret_status_net == 1:
        print('[check_bus] net模块正常工作')
        logging.debug('[check_bus] net模块正常工作')
    else:
        print('[check_bus] net模块故障：未能获取有效数据，请尝试重启机器，等待一定时间')
        logging.error('[check_bus] net模块故障：未能获取有效数据，请尝试重启机器，等待一定时间')
        state = False
        return -1

    # 检查摄像头
    ret_status_camera = check_camera()
    if ret_status_camera == 1:
        print('[check_bus] CAMERA模块正常工作')
        logging.debug('[check_bus] CAMERA模块正常工作')
    else:
        print('[check_bus] CAMERA模块故障：未能获取有效数据，请尝试重启机器，等待一定时间')
        logging.error('[check_bus] CAMERA模块故障：未能获取有效数据，请尝试重启机器，等待一定时间')
        state = False
        return -1

    # 检查gps模块
    ret_status_gps = check_gps()
    if ret_status_gps == 1:
        print('[check_bus] GPS模块正常工作')
        logging.debug('[check_bus] GPS模块正常工作')
    else:
        print('[check_bus] GPS模块故障：未能获取有效数据，请尝试重启机器，等待一定时间')
        logging.error('[check_bus] GPS模块故障：未能获取有效数据，请尝试重启机器，等待一定时间')
        state = False
        return -1

    if state:
        return 1
    else:
        return -1


'''
function:
  检查GPS是否正常工作
  累计count次读数正常则通过 返回 1
  累计count次读数不正常，则失败 ，返回 -1

'''
def check_gps():
    SERIAL = serial.Serial("/dev/ttyUSB0", 9600 )  # 读取GPS的串口
    count = 0
    right = 0
    worng = 0
    while(count<9):                                   # 设定：三次都读取到合理的GPS值，则认定GPS正常工作
            line = str(str(SERIAL.readline())[2:])       # 头部的  b‘ 两个字符不要
            if line.startswith('$GPRMC'):             # 寻找有地理坐标的那一行数据（使用gprmc）
                line = line.replace('\\r\\n\'', '')   # 去除字符串末尾的无用字符
                rmc = pynmea2.parse(line)             # 调库，解析

                LONGITUDE = rmc.longitude      # 获取新的经纬度（本地变量）
                LATITUDE = rmc.latitude

                print('[check_gps] 测试的gps位置：', LONGITUDE, '  ', LATITUDE)
                logging.debug('[check_gps] 测试的gps位置：'+str(LONGITUDE) + '  ' + str(LATITUDE))
                
                count = count + 1

                if LONGITUDE < 127.5 and LONGITUDE > 125.5 and LATITUDE < 46.5 and LATITUDE >45.5:
                    right = right + 1
                    config.gps_test_lon_list.append(LONGITUDE)
                    config.gps_test_la_list.append(LATITUDE)
                else:
                    worng = worng + 1
    #gps_move()
    if right > worng:
        return 1
    else:
        return -1
        #return 1  # 测试



'''
检查摄像头是否能够正常工作
正常工作，返回 1
不正常工作，返回-1
'''

def check_camera():
    '''
    cap = cv2.VideoCapture(0)  # 0: use CSI camera,1：use USB camera
    cap.set(3,480) # set Width
    cap.set(4,360) # set Height
    '''
    if(not config.cap.isOpened()):
        return -1
    else:
        #cap.release()
        return 1

'''
检查网络是否正常
正常返回1
不正常，返回-1

'''
def check_network():
    json_context = {'type':'connect'}
    try:
        response = requests.post(url=config.URL+config.TEST_URL, json=json_context)  # 向服务器发送到达站点的信息
        response.raise_for_status()                                       # 如果响应状态码不是 200，就主动抛出异常
    except requests.RequestException as e:
        print('[check_network] ', e)
        return -1
    else:
        ret_type = json.loads(response.text).get('type')
        if ret_type == 'ok':
            return 1
        return -1


'''
计算出测试GPS读数的定点偏移量
'''

def gps_move():
    if len(config.gps_test_lon_list) < len(config.gps_test_la_list):
        length = len(config.gps_test_lon_list)
    else:
        length = len(config.gps_test_la_list)
    if length <= 0:
        return

    max_lon = 0.0
    min_lon = 360.0
    max_la = 0.0
    min_la = 360.0

    total_lon = 0.0
    total_la = 0.0
    
    for i in range(length):
        total_la = total_la + config.gps_test_la_list[i]
        total_lon = total_lon + config.gps_test_lon_list[i]

        if config.gps_test_la_list[i] > max_la:
            max_la = config.gps_test_la_list[i]

        if config.gps_test_la_list[i] < min_la:
            min_la = config.gps_test_la_list[i]
        
        if config.gps_test_lon_list[i] > max_lon:
            max_lon = config.gps_test_lon_list[i]
        
        if config.gps_test_lon_list[i] < min_lon:
            min_lon = config.gps_test_lon_list[i]

    total_la = total_la / length
    total_lon = total_lon / length

    
    print('gps偏移统计结果： 测试点数： '+ str(length) + '  平均经度： ' + str(total_lon) + ' 平均纬度：' + str(total_la) + ' 最大经度：'+str(max_lon)+ ' 最小经度：'+str(min_lon)+' 最大纬度：'+ str(max_lon)+' 最小纬度：'+str(min_la))
    logging.debug('gps偏移统计结果： 测试点数： '+ str(length) + '  平均经度： ' + str(total_lon) + ' 平均纬度：' + str(total_la) + ' 最大经度：'+str(max_lon)+ ' 最小经度：'+str(min_lon)+' 最大纬度：'+ str(max_lon)+' 最小纬度：'+str(min_la))
    logging.debug('gps偏移结果统计： 最大最小纬度之差：'+str(max_la-min_la)+' 最大最小经度之差：'+str(max_lon-min_lon))


